library(ggplot2)
library(grid)
library(gridExtra)
library(tidyr)
library(dplyr)
library(viridis)
library(oce)
library(vcd)
library(vcdExtra)
library(extracat)
## Set file path
path = "/Users/cynthiaclement/Desktop"
## define year range to look at 
year_min = 1910
year_usdev_max = 2010 
member_alliances = read.csv(paste(path, "version4.1_csv/alliance_v4.1_by_member.csv", sep= "/"))
NMC = read.csv(paste(path, "NMC/NMC_v4_0.csv", sep= "/"))
NMC$cinc[NMC$cinc == -9] <- 0
NMC$irst[NMC$irst == -9] <- 0
NMC$milex[NMC$milex == -9] <- 0
NMC$milper[NMC$milper== -9] <- 0
NMC$pec[NMC$pec == -9] <- 0
NMC$tpop[NMC$tpop == -9] <- 0
NMC$upop[NMC$upop == -9] <- 0
d=data.frame(x1=c(1914,1939, 1947, 1950, 1955, 2001), x2=c(1918, 1945, 1991, 1953, 1975, 2010), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))

NMC Overall

The Composite Index of National Capability (CINC) is a statistical measure of national. It uses an average of percentages of world totals in six different components.The components represent demographic, economic, and military strength.

TPR = total population of country ratio
UPR = urban population of country ratio
ISPR = iron and steel production of country ratio
ECR = primary energy consumption ratio
MER = military expenditure ratio
MPR = military personnel ratio

Current World Powers

countries <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Italy", "Japan", "China")
country_code <- member_alliances$ccode[match(countries, member_alliances$state_name)]
nmc_c  <- c("")
for(code in country_code){
  nmc_c <- rbind(nmc_c, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nmc_c <- nmc_c[c(2:nrow(nmc_c)),]
nmc_c$irst <- as.numeric(nmc_c$irst)
nmc_c$milex <- as.numeric(nmc_c$milex)
nmc_c$milper <- as.numeric(nmc_c$milper)
nmc_c$pec <- as.numeric(nmc_c$pec)
nmc_c$tpop <- as.numeric(nmc_c$tpop)
nmc_c$upop <- as.numeric(nmc_c$upop)
nmc_c$cinc <- as.numeric(nmc_c$cinc)
nmc_c$year <- as.numeric(nmc_c$year)    
## create individual plots of the 6 factors in CINC
irst <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , irst, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Iron and Steel Production")
ex <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , milex, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Military Expenditures")
per <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , milper, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Military Personell")
pec <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , pec, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Primary Energy Consumption Ratio")
tpop <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , tpop, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Total Population")
upop <- ggplot(nmc_c[nmc_c$year > 1930,], aes(year , upop, color = stateabb, group = stateabb)) + geom_point(alpha = 1/100) + geom_line()  + theme(axis.text.x = element_text(angle = 90, hjust = 1), plot.title = element_text(hjust = 0.5)) + ggtitle("Urban Population")
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

## create plots of CINC and mark the different conflicts we are looking at 
d=data.frame(x1=c(1914,1939, 1947, 1950, 1955, 2001), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
nmc_yr<- nmc_c[nmc_c$year > 1900,]
ggplot() + 
  scale_x_continuous(name="x") + 
  scale_y_continuous(name="y") +
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=y1, ymax=max(nmc_yr$pec), fill=Conflict),alpha=0.15) +
  geom_rect(data = d, mapping = aes(xmin=1932, xmax=1939, ymin=0, ymax=max(nmc_yr$pec)), alpha = 1, color = "red")+
  geom_rect(data = d, mapping = aes(xmin=1941, xmax=1941, ymin=0, ymax=max(nmc_yr$pec)), alpha =1, color = "blue") +
  geom_line(data = nmc_yr, aes(x = year, y = pec, color = stateabb, group = stateabb))

## Heatmap of CNIC 
ggplot(nmc_c[nmc_c$year > 1900,], aes(stateabb, year, fill = cinc)) + geom_tile()+
  scale_fill_viridis() + ggtitle("Heatmap of cinc") + theme(axis.text.x = element_text(angle = 60, hjust = 1),plot.title = element_text(hjust = 0.5))

##PCP PLot 
library(GGally)

Attaching package: ‘GGally’

The following object is masked from ‘package:dplyr’:

    nasa
ct <- ggparcoord(nmc_c[nmc_c$year>1930,], columns = 4:10, scale = "uniminmax", alphaLines = .2, groupColumn = "stateabb")
yr <- ggparcoord(nmc_c[nmc_c$year>1930,], columns = 4:10, scale = "uniminmax", alphaLines = .2, groupColumn = "year")
grid.arrange(ct, yr, nrow = 2)

World War I

In the aftermath of the war, four empires disappeared: the German, Austro-Hungarian, Ottoman, and Russian. Numerous nations regained their former independence, and new ones were created.Four dynasties, together with their ancillary aristocracies, all fell as a result of the war: the Romanovs, the Hohenzollerns, the Habsburgs, and the Ottomans. Belgium and Serbia were badly damaged, as was France, with 1.4 million soldiers dead,[183] not counting other casualties. Germany and Russia were similarly affected

allied <- c("United States of America", "United Kingdom", "Russia", "Japan", "Italy")
allied_ccode <- member_alliances$ccode[match(allied, member_alliances$state_name)]
central <- c("Germany", "Turkey", "Austria-Hungary", "Romania", "Bulgaria")
central_ccode <- member_alliances$ccode[match(central, member_alliances$state_name)]
WWI_yrMax = 1928
WWI_yrMin = 1904
WWI <- NMC
alliedP_nmc <- c("")
for(code in allied_ccode){
  alliedP_nmc <- rbind(alliedP_nmc, WWI[WWI$ccode == as.numeric(code),])
}
invalid factor level, NA generated
alliedP_nmc  <- alliedP_nmc [c(2:nrow(alliedP_nmc )),]
alliedP_nmc$side = "Allied Powers"
centralP_nmc <- c("")
for(code in central_ccode){
  centralP_nmc <- rbind(centralP_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
centralP_nmc <- centralP_nmc[c(2:nrow(centralP_nmc)),]
centralP_nmc$side = "Central Powers"
WWI <-rbind(alliedP_nmc,centralP_nmc)
WWI$milex <- as.numeric(WWI$milex)
WWI$milper <- as.numeric(WWI$milper)
WWI$pec <- as.numeric(WWI$pec)
WWI$tpop <- as.numeric(WWI$tpop)
WWI$upop <- as.numeric(WWI$upop)
WWI$cinc <- as.numeric(WWI$cinc)
WWI$year <- as.numeric(WWI$year)
WWI$irst <- as.numeric(WWI$irst)
WWI <- WWI[WWI$year >= WWI_yrMin, ]
WWI <- WWI[WWI$year <= WWI_yrMax, ]
d=data.frame(x1=c(1939), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax= max(WWI$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax= max(WWI$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)

ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=1914, xmax=1918, ymin=0, ymax=max(WWI$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWI, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)

World War II (1939-1945)

allies <- c("United States of America", "United Kingdom", "France", "Russia", "Australia", "Belgium", "Brazil", "Canada", "China", "Denmark", "Greece", "Netherlands", "New Zealand", "Norway", "Poland", "South Africa", "Yugoslavia")
allies_ccode <- member_alliances$ccode[match(allies, member_alliances$state_name)]
axis <- c("Germany", "Italy", "Japan", "Hungary", "Romania", "Bulgaria")
axis_ccode <- member_alliances$ccode[match(axis, member_alliances$state_name)]
## US, GB,JAP, Germn, France, Italy, Russia
WWII_year_st = 1939
WWII_year_end = 1945
allies_nmc <- c("")
for(code in allies_ccode){
  allies_nmc <- rbind(allies_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
allies_nmc  <- allies_nmc [c(2:nrow(allies_nmc )),]
allies_nmc$side = "Allied Powers"
axis_nmc <- c("")
for(code in axis_ccode){
  axis_nmc <- rbind(axis_nmc, NMC[NMC$ccode == as.numeric(code),])
}
invalid factor level, NA generated
axis_nmc <- axis_nmc[c(2:nrow(axis_nmc)),]
axis_nmc$side = "Axis Powers"
WWII <-rbind(allies_nmc,axis_nmc)
WWII$irst <- as.numeric(WWII$irst)
WWII$milex <- as.numeric(WWII$milex)
WWII$milper <- as.numeric(WWII$milper)
WWII$pec <- as.numeric(WWII$pec)
WWII$tpop <- as.numeric(WWII$tpop)
WWII$upop <- as.numeric(WWII$upop)
WWII$cinc <- as.numeric(WWII$cinc)
WWII$year <- as.numeric(WWII$year)
WWII <- WWII[WWII$year < 1950,]
WWII <- WWII[WWII$year > 1934,]
## create plots of CINC and mark the different conflicts we are looking at year 
d=data.frame(x1=c(1939), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
ggplot() + 
  scale_x_continuous(name="x") + 
  scale_y_continuous(name="y") +
  geom_rect(data=d, mapping=aes(xmin=1939, xmax=1945, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<-  ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=WWII_year_st, xmax=WWII_year_end, ymin=0, ymax=max(WWII$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = WWII, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Cold War (1947-1991)

Cold War Wikipedia

The Cold War was a state of geopolitical tension after World War II between powers in the Eastern Bloc (the Soviet Union and its satellite states) and powers in the Western Bloc (the United States, its NATO allies and others). Historians do not fully agree on the dates, but a common timeframe is the period between 1947, the year the Truman Doctrine (a U.S. foreign policy pledging to aid nations threatened by Soviet expansionism) was announced, and 1991, the year the Soviet Union collapsed.

The term “cold” is used because there was no large-scale fighting directly between the two sides, although there were major regional wars, known as proxy wars, supported by the two sides. The Cold War split the temporary wartime alliance against Nazi Germany, leaving the Soviet Union and the United States as two superpowers with profound economic and political differences.

After the dissolution of the Soviet Union, Russia drastically cut military spending, and restructuring the economy left millions unemployed.[281] The capitalist reforms culminated in a recession in the early 1990s more severe than the Great Depression as experienced by the United States and Germany.[282]

The Cold War continues to influence world affairs. The post-Cold War world is considered to be unipolar, with the United States the sole remaining superpower.The Cold War defined the political role of the United States after World War II—by 1989 the United States had military alliances with 50 countries, with 526,000 troops stationed abroad,[286] with 326,000 in Europe (two-thirds of which in west Germany)[287] and 130,000 in Asia (mainly Japan and South Korea).[286] The Cold War also marked the zenith of peacetime military–industrial complexes, especially in the United States, and large-scale military funding of science.[288] These complexes, though their origins may be found as early as the 19th century, snowballed considerably during the Cold War.[289]

NATO <- c("United States of America", "United Kingdom", "Belgium", "Netherlands", "France","Canada", "Portugal", "Italy", "Norway", "Denmark", "Icealnd", "Turkey", "Greece")
nato_ccode  <- member_alliances$ccode[match(NATO, member_alliances$state_name)]
warsaw <- c("Russia", "Czechoslovakia", "Romania", "Bulgaria", "Poland", "Hungary")
warsaw_ccode  <- member_alliances$ccode[match(warsaw, member_alliances$state_name)]
cw_year_st = 1991
cw_year_end = 1947
cw <- NMC
nato_nmc <- c("")
for(code in nato_ccode ){
  nato_nmc <- rbind(nato_nmc, cw[cw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nato_nmc  <- nato_nmc [c(2:nrow(nato_nmc )),]
nato_nmc$side = "US and Allies "
warsaw_nmc <- c("")
for(code in warsaw_ccode ){
  warsaw_nmc <- rbind(warsaw_nmc, cw[cw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
warsaw_nmc <- warsaw_nmc[c(2:nrow(warsaw_nmc)),]
warsaw_nmc$side = "USSR and Allies"
cw <-rbind(nato_nmc,warsaw_nmc)
cw$milex <- as.numeric(cw$milex)
cw$milper <- as.numeric(cw$milper)
cw$pec <- as.numeric(cw$pec)
cw$tpop <- as.numeric(cw$tpop)
cw$upop <- as.numeric(cw$upop)
cw$cinc <- as.numeric(cw$cinc)
cw$year <- as.numeric(cw$year)
cw$irst <- as.numeric(cw$irst)
cw <- cw[cw$year >= cw_year_st-10, ]
ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<-  ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=cw_year_st, xmax=cw_year_end, ymin=0, ymax=max(cw$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = cw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Korean War (1950-1953)

One of the more significant impacts of containment was the outbreak of the Korean War. In June 1950, Kim Il-sung’s North Korean People’s Army invaded South Korea.[99] Joseph Stalin “planned, prepared, and initiated” the invasion,[100] creating “detailed [war] plans” that were communicated to the North Koreans.To Stalin’s surprise,[14] the UN Security Council backed the defense of South Korea, though the Soviets were then boycotting meetings in protest that Taiwan and not Communist China held a permanent seat on the Council.[105] A UN force of personnel from South Korea, the United States, the United Kingdom, Turkey, Canada, Colombia, Australia, France, South Africa, the Philippines, the Netherlands, Belgium, New Zealand and other countries joined to stop the invasion.[106]

General Douglas MacArthur, UN Command CiC (seated), observes the naval shelling of Incheon from the USS Mt. McKinley, September 15, 1950. Among other effects, the Korean War galvanised NATO to develop a military structure.[107] Public opinion in countries involved, such as Great Britain, was divided for and against the war. Many feared an escalation into a general war with Communist China, and even nuclear war. The strong opposition to the war often strained Anglo-American relations. For these reasons British officials sought a speedy end to the conflict, hoping to unite Korea under United Nations auspices and withdrawal of all foreign forces.[108]

Even though the Chinese and North Koreans were exhausted by the war and were prepared to end it by late 1952, Stalin insisted that they continue fighting, and the Armistice was approved only in July 1953, after Stalin’s death.[30] North Korean leader Kim Il Sung created a highly centralized, totalitarian dictatorship – which continues to date – according himself unlimited power and generating a formidable cult of personality.[109][110] In the South, the American-backed strongman Syngman Rhee ran a significantly less brutal but deeply corrupt and authoritarian regime.[111] After Rhee was overthrown in 1960, South Korea fell within a year under a period of military rule that lasted until the re-establishment of a multi-party system in the late 1980s.

sk <- c("United States of America", "United Kingdom", "South Korea")
sk_ccode  <- member_alliances$ccode[match(sk, member_alliances$state_name)]
nk <- c("Russia", "North Korea", "China")
nk_ccode  <- member_alliances$ccode[match(nk, member_alliances$state_name)]
kw_year_st = 1950
kw_year_end = 1953
kw <- NMC
sk_nmc <- c("")
for(code in sk_ccode ){
  sk_nmc <- rbind(sk_nmc, kw[kw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
sk_nmc  <- sk_nmc [c(2:nrow(sk_nmc )),]
sk_nmc$side = "US and Allies "
nk_nmc <- c("")
for(code in nk_ccode ){
  nk_nmc <- rbind(nk_nmc, kw[kw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
nk_nmc <- nk_nmc[c(2:nrow(nk_nmc)),]
nk_nmc$side = "USSR and Allies"
kw <-rbind(sk_nmc,nk_nmc)
kw$milex <- as.numeric(kw$milex)
kw$milper <- as.numeric(kw$milper)
kw$pec <- as.numeric(kw$pec)
kw$tpop <- as.numeric(kw$tpop)
kw$upop <- as.numeric(kw$upop)
kw$cinc <- as.numeric(kw$cinc)
kw$year <- as.numeric(kw$year)
kw$irst <- as.numeric(kw$irst)
kw <- kw[kw$year >= kw_year_st-5, ]
kw <- kw[kw$year < kw_year_end+5, ]
ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<-  ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=kw_year_st, xmax=kw_year_end, ymin=0, ymax=max(kw$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = kw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

Vietnam War (1955-1975)

us <- c("United States of America", "South Korea", "China", "New Zealand", "Australia")
us_ccode  <- member_alliances$ccode[match(us, member_alliances$state_name)]
viet <- c("Russia", "North Korea", "Vietnam", "Cuba")
viet_ccode  <- member_alliances$ccode[match(viet, member_alliances$state_name)]
vw_year_st = 1955
vw_year_end = 1975
vw <- NMC
us_nmc <- c("")
for(code in us_ccode ){
  us_nmc <- rbind(us_nmc, vw[vw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
us_nmc  <- us_nmc [c(2:nrow(us_nmc )),]
us_nmc$side = "US and Allies "
viet_nmc <- c("")
for(code in viet_ccode ){
  viet_nmc <- rbind(viet_nmc, vw[vw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
viet_nmc <- viet_nmc[c(2:nrow(viet_nmc)),]
viet_nmc$side = "Vietnam and Allies"
vw <-rbind(us_nmc,viet_nmc)
vw$milex <- as.numeric(vw$milex)
vw$milper <- as.numeric(vw$milper)
vw$pec <- as.numeric(vw$pec)
vw$tpop <- as.numeric(vw$tpop)
vw$upop <- as.numeric(vw$upop)
vw$cinc <- as.numeric(vw$cinc)
vw$year <- as.numeric(vw$year)
vw$irst <- as.numeric(vw$irst)
vw <- vw[vw$year >= vw_year_st-5, ]
vw <- vw[vw$year < vw_year_end+5, ]
ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<-  ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=vw_year_st, xmax=vw_year_end, ymin=0, ymax=max(vw$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = vw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

War in Afghanistan (2001-2010)

The war in Afghanistan (or the American war in Afghanistan) followed the 2001 United States invasion of Afghanistan.Supported initially by the United Kingdom, the US was later joined by the rest of NATO, beginning in 2003. Its public aims were to dismantle al-Qaeda and to deny it a safe base of operations in Afghanistan by removing the Taliban from power.[32] Key allies, including the United Kingdom, supported the U.S. from the start to the end of the phase. This phase of the war is the longest war in United States history.

Result:

  • Destruction of al-Qaeda and Taliban militant training camps
  • Fall of the Taliban government
  • Establishment of the Islamic Republic of Afghanistan under the Karzai administration
  • Start of Taliban insurgency
  • Death of Osama bin Laden
  • Commencement of war’s 2015–present phase
us <- c("United States of America", "United Kingdom", "Canada", "Germany", "Australia")
us_ccode  <- member_alliances$ccode[match(us, member_alliances$state_name)]
afg <- c("Afghanistan")
afg_ccode  <- member_alliances$ccode[match(afg, member_alliances$state_name)]
aw_year_st = 2001
aw_year_end = 2010
aw <- NMC
us_nmc <- c("")
for(code in us_ccode ){
  us_nmc <- rbind(us_nmc, aw[aw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
us_nmc  <- us_nmc [c(2:nrow(us_nmc )),]
us_nmc$side = "US and UN"
afg_nmc <- c("")
for(code in afg_ccode ){
  afg_nmc <- rbind(afg_nmc, aw[aw$ccode == as.numeric(code),])
}
invalid factor level, NA generated
afg_nmc <- afg_nmc[c(2:nrow(afg_nmc)),]
afg_nmc$side = "Afghanistan"
aw <-rbind(us_nmc,afg_nmc)
aw$milex <- as.numeric(aw$milex)
aw$milper <- as.numeric(aw$milper)
aw$pec <- as.numeric(aw$pec)
aw$tpop <- as.numeric(aw$tpop)
aw$upop <- as.numeric(aw$upop)
aw$cinc <- as.numeric(aw$cinc)
aw$year <- as.numeric(aw$year)
aw$irst <- as.numeric(aw$irst)
aw <- aw[aw$year >= aw_year_st-10, ]
ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=.4),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = cinc, color = stateabb, group = stateabb)) + facet_wrap(~side)

irst<-  ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$irst)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = irst, color = stateabb, group = stateabb)) + facet_wrap(~side)
ex<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$milex)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = milex, color = stateabb, group = stateabb)) + facet_wrap(~side)
per<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$milper)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = milper, color = stateabb, group = stateabb)) + facet_wrap(~side)
pec<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$pec)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = pec, color = stateabb, group = stateabb)) + facet_wrap(~side)
upop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$upop)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = upop, color = stateabb, group = stateabb)) + facet_wrap(~side)
tpop<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=aw_year_st, xmax=aw_year_end, ymin=0, ymax=max(aw$tpop)),alpha=0.1, fill = "salmon") +
  geom_line(data = aw, aes(x = year, y = tpop, color = stateabb, group = stateabb)) + facet_wrap(~side)
grid.arrange(irst, ex, per, pec, tpop, upop , nrow = 3)

## looking at ratios 
nmc_c2 <-nmc_c
#nmc_c2$irst <- nmc_c2$irst/max(nmc_c2$irst)
#nmc_c2$milex <- nmc_c2$milex/max(nmc_c2$milex)
#nmc_c2$milper <- nmc_c2$milper/max(nmc_c2$milper)
#nmc_c2$pec <- nmc_c2$pec/max(nmc_c2$pec)
#nmc_c2$tpop <- nmc_c2$tpop/max(nmc_c2$tpop)
#nmc_c2$upop <- nmc_c2$upop/max(nmc_c2$upop)
nmc_c3<- gather(nmc_c2, metric, value, irst:upop)
ggplot() + 
geom_rect(data=d, mapping=aes(xmin = x1, xmax=x2, ymin=0, ymax=1, fill = Conflict ),alpha=0.25) +
geom_line(data = nmc_c3, aes(x = year, y = value, color = stateabb), alpha = 1) + facet_wrap(~metric)

Calculate Ratios

NMC = read.csv(paste(path, "NMC/NMC_v4_0.csv", sep= "/"))
NMC$cinc[NMC$cinc == -9] <- 0
NMC$irst[NMC$irst == -9] <- 0
NMC$milex[NMC$milex == -9] <- 0
NMC$milper[NMC$milper== -9] <- 0
NMC$pec[NMC$pec == -9] <- 0
NMC$tpop[NMC$tpop == -9] <- 0
NMC$upop[NMC$upop == -9] <- 0
ggplot(NMC[NMC$year > 1900,], aes(stateabb, year, fill = cinc)) + geom_tile()+
  scale_fill_viridis() + ggtitle("Heatmap of cinc") + theme(axis.text.x = element_text(angle = 60, hjust = 1),plot.title = element_text(hjust = 0.5))

all_year <- c(1900:2007)
NMC$cinc[NMC$cinc == -9| is.na(NMC$cinc)] <- 0
NMC$irst[NMC$irst == -9| is.na(NMC$irst)] <- 0
NMC$milex[NMC$milex == -9| is.na(NMC$milex)] <- 0
NMC$milper[NMC$milper== -9| is.na(NMC$milper)] <- 0
NMC$pec[NMC$pec == -9| is.na(NMC$pec)] <- 0
NMC$tpop[NMC$tpop == -9| is.na(NMC$tpop)] <- 0
NMC$upop[NMC$upop == -9| is.na(NMC$upop)] <- 0
NMC$irst <- as.numeric(NMC$irst)
NMC$milex <- as.numeric(NMC$milex)
NMC$milper <- as.numeric(NMC$milper)
NMC$pec <- as.numeric(NMC$pec)
NMC$tpop <- as.numeric(NMC$tpop)
NMC$upop <- as.numeric(NMC$upop)
NMC$cinc <- as.numeric(NMC$cinc)
NMC$year <- as.numeric(NMC$year)
yr2000 <- NMC[NMC$year == 1971, ] 
apply(yr2000, 2, max)
      stateabb          ccode           year           irst          milex         milper            pec           tpop           upop           cinc        version 
         "ZIM"          "950"         "1971"       "121000"     "82700000"         "3900" "9.671694e+03"       "851419"       "100470"   "0.17401890"            "4" 
NMC2 <- c("")
for (year_t in all_year){
  yr <- NMC[NMC$year == year_t, ] 
  
  max <- apply(yr, 2, max)
  max <- as.numeric(max[4:9])
  
  for (i in 4:9){
    yr[,i] = yr[,i]/max[i-3]
  }
  NMC2 <- rbind(NMC2, yr)
}
invalid factor level, NA generated
NMC2 <- NMC2[c(2:nrow(NMC2)),]
d=data.frame(x1=c(1914,1939, 1947, 1950, 1955, 2001), x2=c(1918, 1945, 1991, 1953, 1975, 2010), y1=c(0,0,0,0,0,0), y2=c(.4,.4,.4,.4,.4,.4), Conflict=c("WWI", "WWII", "Cold War", "Korean War", "Vietnam War", "Afghanistan War"), r=c(1,2,3,4,5,6))
NMC2_yr<- NMC2[NMC2$year > 1900,]
countries <- c("United States of America", "United Kingdom", "France", "Russia","Germany", "Italy", "Japan", "China")
country_code <- member_alliances$ccode[match(countries, member_alliances$state_name)]
NMC2_yr <- filter(NMC2_yr, NMC2_yr$ccode %in% country_code )
NMC_orig_yr <- filter(NMC, NMC$ccode %in% country_code )
NMC2_yr$irst <- as.numeric(NMC2_yr$irst)
NMC2_yr$milex <- as.numeric(NMC2_yr$milex)
NMC2_yr$milper <- as.numeric(NMC2_yr$milper)
NMC2_yr$pec <- as.numeric(NMC2_yr$pec)
NMC2_yr$tpop <- as.numeric(NMC2_yr$tpop)
NMC2_yr$upop <- as.numeric(NMC2_yr$upop)
NMC2_yr$cinc <- as.numeric(NMC2_yr$cinc)
NMC2_yr$year <- as.numeric(NMC2_yr$year)
a<- ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC2_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
a2<- ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
b<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC2_yr, aes(x = year, y = milex, color = stateabb, group = stateabb))+ theme(legend.position="none")
b2<- ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
c<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC2_yr, aes(x = year, y = milper, color = stateabb, group = stateabb))+ theme(legend.position="none")
c2<- ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
d2<- ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC_orig_yr, aes(x = year, y = irst, color = stateabb, group = stateabb))+ theme(legend.position="none")
d<-ggplot() + 
  geom_rect(data=d, mapping=aes(xmin=x1, xmax=x2, ymin=0, ymax=1, fill=Conflict),alpha=0.15) +
  geom_line(data = NMC2_yr, aes(x = year, y = tpop, color = stateabb, group = stateabb))+ theme(legend.position="none")
grid.arrange(a,a2, b, b2, c, c2, d ,nrow = 4 )

LS0tCnRpdGxlOiAiTk1DIEFuYWx5c2lzIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgoKYGBge3J9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeSh0aWR5cikKbGlicmFyeShkcGx5cikKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KG9jZSkKbGlicmFyeSh2Y2QpCmxpYnJhcnkodmNkRXh0cmEpCmxpYnJhcnkoZXh0cmFjYXQpCgojIyBTZXQgZmlsZSBwYXRoCnBhdGggPSAiL1VzZXJzL2N5bnRoaWFjbGVtZW50L0Rlc2t0b3AiCgojIyBkZWZpbmUgeWVhciByYW5nZSB0byBsb29rIGF0IAp5ZWFyX21pbiA9IDE5MTAKeWVhcl91c2Rldl9tYXggPSAyMDEwIAoKbWVtYmVyX2FsbGlhbmNlcyA9IHJlYWQuY3N2KHBhc3RlKHBhdGgsICJ2ZXJzaW9uNC4xX2Nzdi9hbGxpYW5jZV92NC4xX2J5X21lbWJlci5jc3YiLCBzZXA9ICIvIikpCk5NQyA9IHJlYWQuY3N2KHBhc3RlKHBhdGgsICJOTUMvTk1DX3Y0XzAuY3N2Iiwgc2VwPSAiLyIpKQoKTk1DJGNpbmNbTk1DJGNpbmMgPT0gLTldIDwtIDAKTk1DJGlyc3RbTk1DJGlyc3QgPT0gLTldIDwtIDAKTk1DJG1pbGV4W05NQyRtaWxleCA9PSAtOV0gPC0gMApOTUMkbWlscGVyW05NQyRtaWxwZXI9PSAtOV0gPC0gMApOTUMkcGVjW05NQyRwZWMgPT0gLTldIDwtIDAKTk1DJHRwb3BbTk1DJHRwb3AgPT0gLTldIDwtIDAKTk1DJHVwb3BbTk1DJHVwb3AgPT0gLTldIDwtIDAKCgpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCBDb25mbGljdD1jKCJXV0kiLCAiV1dJSSIsICJDb2xkIFdhciIsICJLb3JlYW4gV2FyIiwgIlZpZXRuYW0gV2FyIiwgIkFmZ2hhbmlzdGFuIFdhciIpLCByPWMoMSwyLDMsNCw1LDYpKQpgYGAKCgoKI05NQyBPdmVyYWxsIAoKVGhlIENvbXBvc2l0ZSBJbmRleCBvZiBOYXRpb25hbCBDYXBhYmlsaXR5IChDSU5DKSBpcyBhIHN0YXRpc3RpY2FsIG1lYXN1cmUgb2YgbmF0aW9uYWwuIEl0IHVzZXMgYW4gYXZlcmFnZSBvZiBwZXJjZW50YWdlcyBvZiB3b3JsZCB0b3RhbHMgaW4gc2l4IGRpZmZlcmVudCBjb21wb25lbnRzLlRoZSBjb21wb25lbnRzIHJlcHJlc2VudCBkZW1vZ3JhcGhpYywgZWNvbm9taWMsIGFuZCBtaWxpdGFyeSBzdHJlbmd0aC4gIAogIApUUFIgPSB0b3RhbCBwb3B1bGF0aW9uIG9mIGNvdW50cnkgcmF0aW8gIApVUFIgPSB1cmJhbiBwb3B1bGF0aW9uIG9mIGNvdW50cnkgcmF0aW8gIApJU1BSID0gaXJvbiBhbmQgc3RlZWwgcHJvZHVjdGlvbiBvZiBjb3VudHJ5IHJhdGlvICAKRUNSID0gcHJpbWFyeSBlbmVyZ3kgY29uc3VtcHRpb24gcmF0aW8gIApNRVIgPSBtaWxpdGFyeSBleHBlbmRpdHVyZSByYXRpbyAgCk1QUiA9IG1pbGl0YXJ5IHBlcnNvbm5lbCByYXRpbyAgCgojIyMgQ3VycmVudCBXb3JsZCBQb3dlcnMKCmBgYHtyIGZpZy53aWR0aD0xMiwgZmlnLmhlaWdodD0xMn0KY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJVbml0ZWQgS2luZ2RvbSIsICJGcmFuY2UiLCAiUnVzc2lhIiwiR2VybWFueSIsICJJdGFseSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCm5tY19jICA8LSBjKCIiKQpmb3IoY29kZSBpbiBjb3VudHJ5X2NvZGUpewogIG5tY19jIDwtIHJiaW5kKG5tY19jLCBOTUNbTk1DJGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQoKbm1jX2MgPC0gbm1jX2NbYygyOm5yb3cobm1jX2MpKSxdCm5tY19jJGlyc3QgPC0gYXMubnVtZXJpYyhubWNfYyRpcnN0KQpubWNfYyRtaWxleCA8LSBhcy5udW1lcmljKG5tY19jJG1pbGV4KQpubWNfYyRtaWxwZXIgPC0gYXMubnVtZXJpYyhubWNfYyRtaWxwZXIpCm5tY19jJHBlYyA8LSBhcy5udW1lcmljKG5tY19jJHBlYykKbm1jX2MkdHBvcCA8LSBhcy5udW1lcmljKG5tY19jJHRwb3ApCm5tY19jJHVwb3AgPC0gYXMubnVtZXJpYyhubWNfYyR1cG9wKQpubWNfYyRjaW5jIDwtIGFzLm51bWVyaWMobm1jX2MkY2luYykKbm1jX2MkeWVhciA8LSBhcy5udW1lcmljKG5tY19jJHllYXIpICAgIAoKCiMjIGNyZWF0ZSBpbmRpdmlkdWFsIHBsb3RzIG9mIHRoZSA2IGZhY3RvcnMgaW4gQ0lOQwoKaXJzdCA8LSBnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MzAsXSwgYWVzKHllYXIgLCBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBnZW9tX3BvaW50KGFscGhhID0gMS8xMDApICsgZ2VvbV9saW5lKCkgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2d0aXRsZSgiSXJvbiBhbmQgU3RlZWwgUHJvZHVjdGlvbiIpCmV4IDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBnZW9tX3BvaW50KGFscGhhID0gMS8xMDApICsgZ2VvbV9saW5lKCkgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgaGp1c3QgPSAxKSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgZ2d0aXRsZSgiTWlsaXRhcnkgRXhwZW5kaXR1cmVzIikKcGVyIDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZ2VvbV9wb2ludChhbHBoYSA9IDEvMTAwKSArIGdlb21fbGluZSgpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIGdndGl0bGUoIk1pbGl0YXJ5IFBlcnNvbmVsbCIpCnBlYyA8LSBnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MzAsXSwgYWVzKHllYXIgLCBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGdlb21fcG9pbnQoYWxwaGEgPSAxLzEwMCkgKyBnZW9tX2xpbmUoKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZ3RpdGxlKCJQcmltYXJ5IEVuZXJneSBDb25zdW1wdGlvbiBSYXRpbyIpCnRwb3AgPC0gZ2dwbG90KG5tY19jW25tY19jJHllYXIgPiAxOTMwLF0sIGFlcyh5ZWFyICwgdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZ2VvbV9wb2ludChhbHBoYSA9IDEvMTAwKSArIGdlb21fbGluZSgpICArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIGhqdXN0ID0gMSksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIGdndGl0bGUoIlRvdGFsIFBvcHVsYXRpb24iKQp1cG9wIDwtIGdncGxvdChubWNfY1tubWNfYyR5ZWFyID4gMTkzMCxdLCBhZXMoeWVhciAsIHVwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGdlb21fcG9pbnQoYWxwaGEgPSAxLzEwMCkgKyBnZW9tX2xpbmUoKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCBoanVzdCA9IDEpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkgKyBnZ3RpdGxlKCJVcmJhbiBQb3B1bGF0aW9uIikKZ3JpZC5hcnJhbmdlKGlyc3QsIGV4LCBwZXIsIHBlYywgdHBvcCwgdXBvcCAsIG5yb3cgPSAzKQoKYGBgCgpgYGB7cn0KIyMgY3JlYXRlIHBsb3RzIG9mIENJTkMgYW5kIG1hcmsgdGhlIGRpZmZlcmVudCBjb25mbGljdHMgd2UgYXJlIGxvb2tpbmcgYXQgCgpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCB5MT1jKDAsMCwwLDAsMCwwKSwgeTI9YyguNCwuNCwuNCwuNCwuNCwuNCksIENvbmZsaWN0PWMoIldXSSIsICJXV0lJIiwgIkNvbGQgV2FyIiwgIktvcmVhbiBXYXIiLCAiVmlldG5hbSBXYXIiLCAiQWZnaGFuaXN0YW4gV2FyIiksIHI9YygxLDIsMyw0LDUsNikpCm5tY195cjwtIG5tY19jW25tY19jJHllYXIgPiAxOTAwLF0KZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ieCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9InkiKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj15MSwgeW1heD1tYXgobm1jX3lyJHBlYyksIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX3JlY3QoZGF0YSA9IGQsIG1hcHBpbmcgPSBhZXMoeG1pbj0xOTMyLCB4bWF4PTE5MzksIHltaW49MCwgeW1heD1tYXgobm1jX3lyJHBlYykpLCBhbHBoYSA9IDEsIGNvbG9yID0gInJlZCIpKwogIGdlb21fcmVjdChkYXRhID0gZCwgbWFwcGluZyA9IGFlcyh4bWluPTE5NDEsIHhtYXg9MTk0MSwgeW1pbj0wLCB5bWF4PW1heChubWNfeXIkcGVjKSksIGFscGhhID0xLCBjb2xvciA9ICJibHVlIikgKwogIGdlb21fbGluZShkYXRhID0gbm1jX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKQoKCmBgYAoKCmBgYHtyfQojIyBIZWF0bWFwIG9mIENOSUMgCgpnZ3Bsb3Qobm1jX2Nbbm1jX2MkeWVhciA+IDE5MDAsXSwgYWVzKHN0YXRlYWJiLCB5ZWFyLCBmaWxsID0gY2luYykpICsgZ2VvbV90aWxlKCkrCiAgc2NhbGVfZmlsbF92aXJpZGlzKCkgKyBnZ3RpdGxlKCJIZWF0bWFwIG9mIGNpbmMiKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNjAsIGhqdXN0ID0gMSkscGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpCgoKYGBgCgoKYGBge3J9CiMjUENQIFBMb3QgCmxpYnJhcnkoR0dhbGx5KQpjdCA8LSBnZ3BhcmNvb3JkKG5tY19jW25tY19jJHllYXI+MTkzMCxdLCBjb2x1bW5zID0gNDoxMCwgc2NhbGUgPSAidW5pbWlubWF4IiwgYWxwaGFMaW5lcyA9IC4yLCBncm91cENvbHVtbiA9ICJzdGF0ZWFiYiIpCnlyIDwtIGdncGFyY29vcmQobm1jX2Nbbm1jX2MkeWVhcj4xOTMwLF0sIGNvbHVtbnMgPSA0OjEwLCBzY2FsZSA9ICJ1bmltaW5tYXgiLCBhbHBoYUxpbmVzID0gLjIsIGdyb3VwQ29sdW1uID0gInllYXIiKQpncmlkLmFycmFuZ2UoY3QsIHlyLCBucm93ID0gMikKCgpgYGAKCgoKIyNXb3JsZCBXYXIgSQogIApJbiB0aGUgYWZ0ZXJtYXRoIG9mIHRoZSB3YXIsIGZvdXIgZW1waXJlcyBkaXNhcHBlYXJlZDogdGhlIEdlcm1hbiwgQXVzdHJvLUh1bmdhcmlhbiwgT3R0b21hbiwgYW5kIFJ1c3NpYW4uIE51bWVyb3VzIG5hdGlvbnMgcmVnYWluZWQgdGhlaXIgZm9ybWVyIGluZGVwZW5kZW5jZSwgYW5kIG5ldyBvbmVzIHdlcmUgY3JlYXRlZC5Gb3VyIGR5bmFzdGllcywgdG9nZXRoZXIgd2l0aCB0aGVpciBhbmNpbGxhcnkgYXJpc3RvY3JhY2llcywgYWxsIGZlbGwgYXMgYSByZXN1bHQgb2YgdGhlIHdhcjogdGhlIFJvbWFub3ZzLCB0aGUgSG9oZW56b2xsZXJucywgdGhlIEhhYnNidXJncywgYW5kIHRoZSBPdHRvbWFucy4gQmVsZ2l1bSBhbmQgU2VyYmlhIHdlcmUgYmFkbHkgZGFtYWdlZCwgYXMgd2FzIEZyYW5jZSwgd2l0aCAxLjQgbWlsbGlvbiBzb2xkaWVycyBkZWFkLFsxODNdIG5vdCBjb3VudGluZyBvdGhlciBjYXN1YWx0aWVzLiBHZXJtYW55IGFuZCBSdXNzaWEgd2VyZSBzaW1pbGFybHkgYWZmZWN0ZWQKCmBgYHtyfQphbGxpZWQgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIlJ1c3NpYSIsICJKYXBhbiIsICJJdGFseSIpCmFsbGllZF9jY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGFsbGllZCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCmNlbnRyYWwgPC0gYygiR2VybWFueSIsICJUdXJrZXkiLCAiQXVzdHJpYS1IdW5nYXJ5IiwgIlJvbWFuaWEiLCAiQnVsZ2FyaWEiKQpjZW50cmFsX2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goY2VudHJhbCwgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpXV0lfeXJNYXggPSAxOTI4CldXSV95ck1pbiA9IDE5MDQKCldXSSA8LSBOTUMKCmFsbGllZFBfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIGFsbGllZF9jY29kZSl7CiAgYWxsaWVkUF9ubWMgPC0gcmJpbmQoYWxsaWVkUF9ubWMsIFdXSVtXV0kkY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CmFsbGllZFBfbm1jICA8LSBhbGxpZWRQX25tYyBbYygyOm5yb3coYWxsaWVkUF9ubWMgKSksXQphbGxpZWRQX25tYyRzaWRlID0gIkFsbGllZCBQb3dlcnMiCgpjZW50cmFsUF9ubWMgPC0gYygiIikKZm9yKGNvZGUgaW4gY2VudHJhbF9jY29kZSl7CiAgY2VudHJhbFBfbm1jIDwtIHJiaW5kKGNlbnRyYWxQX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KY2VudHJhbFBfbm1jIDwtIGNlbnRyYWxQX25tY1tjKDI6bnJvdyhjZW50cmFsUF9ubWMpKSxdCmNlbnRyYWxQX25tYyRzaWRlID0gIkNlbnRyYWwgUG93ZXJzIgoKCldXSSA8LXJiaW5kKGFsbGllZFBfbm1jLGNlbnRyYWxQX25tYykKV1dJJG1pbGV4IDwtIGFzLm51bWVyaWMoV1dJJG1pbGV4KQpXV0kkbWlscGVyIDwtIGFzLm51bWVyaWMoV1dJJG1pbHBlcikKV1dJJHBlYyA8LSBhcy5udW1lcmljKFdXSSRwZWMpCldXSSR0cG9wIDwtIGFzLm51bWVyaWMoV1dJJHRwb3ApCldXSSR1cG9wIDwtIGFzLm51bWVyaWMoV1dJJHVwb3ApCldXSSRjaW5jIDwtIGFzLm51bWVyaWMoV1dJJGNpbmMpCldXSSR5ZWFyIDwtIGFzLm51bWVyaWMoV1dJJHllYXIpCldXSSRpcnN0IDwtIGFzLm51bWVyaWMoV1dJJGlyc3QpCgoKV1dJIDwtIFdXSVtXV0kkeWVhciA+PSBXV0lfeXJNaW4sIF0KV1dJIDwtIFdXSVtXV0kkeWVhciA8PSBXV0lfeXJNYXgsIF0KCmBgYAoKCmBgYHtyfQpkPWRhdGEuZnJhbWUoeDE9YygxOTM5KSwgeDI9YygxOTE4LCAxOTQ1LCAxOTkxLCAxOTUzLCAxOTc1LCAyMDEwKSwgeTE9YygwLDAsMCwwLDAsMCksIHkyPWMoLjQsLjQsLjQsLjQsLjQsLjQpLCBDb25mbGljdD1jKCJXV0kiLCAiV1dJSSIsICJDb2xkIFdhciIsICJLb3JlYW4gV2FyIiwgIlZpZXRuYW0gV2FyIiwgIkFmZ2hhbmlzdGFuIFdhciIpLCByPWMoMSwyLDMsNCw1LDYpKQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgoKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPTE5MTQsIHhtYXg9MTkxOCwgeW1pbj0wLCB5bWF4PW1heChXV0kkaXJzdCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9IG1heChXV0kkbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJLCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD0gbWF4KFdXSSRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKYGBgCgoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD1tYXgoV1dJJG1pbHBlcikpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTE0LCB4bWF4PTE5MTgsIHltaW49MCwgeW1heD1tYXgoV1dJJHBlYykpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCgpgYGAKCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPTE5MTQsIHhtYXg9MTkxOCwgeW1pbj0wLCB5bWF4PW1heChXV0kkdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0ksIGFlcyh4ID0geWVhciwgeSA9IHRwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49MTkxNCwgeG1heD0xOTE4LCB5bWluPTAsIHltYXg9bWF4KFdXSSR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSSwgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCgpgYGAKCgojI1dvcmxkIFdhciBJSSAoMTkzOS0xOTQ1KQoKYGBge3J9CgphbGxpZXMgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkZyYW5jZSIsICJSdXNzaWEiLCAiQXVzdHJhbGlhIiwgIkJlbGdpdW0iLCAiQnJhemlsIiwgIkNhbmFkYSIsICJDaGluYSIsICJEZW5tYXJrIiwgIkdyZWVjZSIsICJOZXRoZXJsYW5kcyIsICJOZXcgWmVhbGFuZCIsICJOb3J3YXkiLCAiUG9sYW5kIiwgIlNvdXRoIEFmcmljYSIsICJZdWdvc2xhdmlhIikKYWxsaWVzX2Njb2RlIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goYWxsaWVzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKYXhpcyA8LSBjKCJHZXJtYW55IiwgIkl0YWx5IiwgIkphcGFuIiwgIkh1bmdhcnkiLCAiUm9tYW5pYSIsICJCdWxnYXJpYSIpCmF4aXNfY2NvZGUgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChheGlzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKIyMgVVMsIEdCLEpBUCwgR2VybW4sIEZyYW5jZSwgSXRhbHksIFJ1c3NpYQoKV1dJSV95ZWFyX3N0ID0gMTkzOQpXV0lJX3llYXJfZW5kID0gMTk0NQoKYWxsaWVzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiBhbGxpZXNfY2NvZGUpewogIGFsbGllc19ubWMgPC0gcmJpbmQoYWxsaWVzX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KYWxsaWVzX25tYyAgPC0gYWxsaWVzX25tYyBbYygyOm5yb3coYWxsaWVzX25tYyApKSxdCmFsbGllc19ubWMkc2lkZSA9ICJBbGxpZWQgUG93ZXJzIgpheGlzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiBheGlzX2Njb2RlKXsKICBheGlzX25tYyA8LSByYmluZChheGlzX25tYywgTk1DW05NQyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0KYXhpc19ubWMgPC0gYXhpc19ubWNbYygyOm5yb3coYXhpc19ubWMpKSxdCmF4aXNfbm1jJHNpZGUgPSAiQXhpcyBQb3dlcnMiCgpXV0lJIDwtcmJpbmQoYWxsaWVzX25tYyxheGlzX25tYykKV1dJSSRpcnN0IDwtIGFzLm51bWVyaWMoV1dJSSRpcnN0KQpXV0lJJG1pbGV4IDwtIGFzLm51bWVyaWMoV1dJSSRtaWxleCkKV1dJSSRtaWxwZXIgPC0gYXMubnVtZXJpYyhXV0lJJG1pbHBlcikKV1dJSSRwZWMgPC0gYXMubnVtZXJpYyhXV0lJJHBlYykKV1dJSSR0cG9wIDwtIGFzLm51bWVyaWMoV1dJSSR0cG9wKQpXV0lJJHVwb3AgPC0gYXMubnVtZXJpYyhXV0lJJHVwb3ApCldXSUkkY2luYyA8LSBhcy5udW1lcmljKFdXSUkkY2luYykKV1dJSSR5ZWFyIDwtIGFzLm51bWVyaWMoV1dJSSR5ZWFyKQoKV1dJSSA8LSBXV0lJW1dXSUkkeWVhciA8IDE5NTAsXQpXV0lJIDwtIFdXSUlbV1dJSSR5ZWFyID4gMTkzNCxdCgpgYGAKCgpgYGB7cn0KIyMgY3JlYXRlIHBsb3RzIG9mIENJTkMgYW5kIG1hcmsgdGhlIGRpZmZlcmVudCBjb25mbGljdHMgd2UgYXJlIGxvb2tpbmcgYXQgeWVhciAKZD1kYXRhLmZyYW1lKHgxPWMoMTkzOSksIHgyPWMoMTkxOCwgMTk0NSwgMTk5MSwgMTk1MywgMTk3NSwgMjAxMCksIHkxPWMoMCwwLDAsMCwwLDApLCB5Mj1jKC40LC40LC40LC40LC40LC40KSwgQ29uZmxpY3Q9YygiV1dJIiwgIldXSUkiLCAiQ29sZCBXYXIiLCAiS29yZWFuIFdhciIsICJWaWV0bmFtIFdhciIsICJBZmdoYW5pc3RhbiBXYXIiKSwgcj1jKDEsMiwzLDQsNSw2KSkKZ2dwbG90KCkgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZT0ieCIpICsgCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWU9InkiKSArCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj0xOTM5LCB4bWF4PTE5NDUsIHltaW49MCwgeW1heD0uNCksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9MTJ9CgppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gaXJzdCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmV4PC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49V1dJSV95ZWFyX3N0LCB4bWF4PVdXSUlfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoV1dJSSRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBXV0lJLCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlcjwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPVdXSUlfeWVhcl9zdCwgeG1heD1XV0lJX3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KFdXSUkkbWlscGVyKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPVdXSUlfeWVhcl9zdCwgeG1heD1XV0lJX3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KFdXSUkkcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IFdXSUksIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnVwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJHVwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnRwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1XV0lJX3llYXJfc3QsIHhtYXg9V1dJSV95ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChXV0lJJHRwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gV1dJSSwgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgoKCgojI0NvbGQgV2FyICgxOTQ3LTE5OTEpCgpbQ29sZCBXYXIgV2lraXBlZGlhXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db2xkX1dhcikKClRoZSBDb2xkIFdhciB3YXMgYSBzdGF0ZSBvZiBnZW9wb2xpdGljYWwgdGVuc2lvbiBhZnRlciBXb3JsZCBXYXIgSUkgYmV0d2VlbiBwb3dlcnMgaW4gdGhlIEVhc3Rlcm4gQmxvYyAodGhlIFNvdmlldCBVbmlvbiBhbmQgaXRzIHNhdGVsbGl0ZSBzdGF0ZXMpIGFuZCBwb3dlcnMgaW4gdGhlIFdlc3Rlcm4gQmxvYyAodGhlIFVuaXRlZCBTdGF0ZXMsIGl0cyBOQVRPIGFsbGllcyBhbmQgb3RoZXJzKS4gSGlzdG9yaWFucyBkbyBub3QgZnVsbHkgYWdyZWUgb24gdGhlIGRhdGVzLCBidXQgYSBjb21tb24gdGltZWZyYW1lIGlzIHRoZSBwZXJpb2QgYmV0d2VlbiAxOTQ3LCB0aGUgeWVhciB0aGUgVHJ1bWFuIERvY3RyaW5lIChhIFUuUy4gZm9yZWlnbiBwb2xpY3kgcGxlZGdpbmcgdG8gYWlkIG5hdGlvbnMgdGhyZWF0ZW5lZCBieSBTb3ZpZXQgZXhwYW5zaW9uaXNtKSB3YXMgYW5ub3VuY2VkLCBhbmQgMTk5MSwgdGhlIHllYXIgdGhlIFNvdmlldCBVbmlvbiBjb2xsYXBzZWQuCgpUaGUgdGVybSAiY29sZCIgaXMgdXNlZCBiZWNhdXNlIHRoZXJlIHdhcyBubyBsYXJnZS1zY2FsZSBmaWdodGluZyBkaXJlY3RseSBiZXR3ZWVuIHRoZSB0d28gc2lkZXMsIGFsdGhvdWdoIHRoZXJlIHdlcmUgbWFqb3IgcmVnaW9uYWwgd2Fycywga25vd24gYXMgcHJveHkgd2Fycywgc3VwcG9ydGVkIGJ5IHRoZSB0d28gc2lkZXMuIFRoZSBDb2xkIFdhciBzcGxpdCB0aGUgdGVtcG9yYXJ5IHdhcnRpbWUgYWxsaWFuY2UgYWdhaW5zdCBOYXppIEdlcm1hbnksIGxlYXZpbmcgdGhlIFNvdmlldCBVbmlvbiBhbmQgdGhlIFVuaXRlZCBTdGF0ZXMgYXMgdHdvIHN1cGVycG93ZXJzIHdpdGggcHJvZm91bmQgZWNvbm9taWMgYW5kIHBvbGl0aWNhbCBkaWZmZXJlbmNlcy4gCgpBZnRlciB0aGUgZGlzc29sdXRpb24gb2YgdGhlIFNvdmlldCBVbmlvbiwgUnVzc2lhIGRyYXN0aWNhbGx5IGN1dCBtaWxpdGFyeSBzcGVuZGluZywgYW5kIHJlc3RydWN0dXJpbmcgdGhlIGVjb25vbXkgbGVmdCBtaWxsaW9ucyB1bmVtcGxveWVkLlsyODFdIFRoZSBjYXBpdGFsaXN0IHJlZm9ybXMgY3VsbWluYXRlZCBpbiBhIHJlY2Vzc2lvbiBpbiB0aGUgZWFybHkgMTk5MHMgbW9yZSBzZXZlcmUgdGhhbiB0aGUgR3JlYXQgRGVwcmVzc2lvbiBhcyBleHBlcmllbmNlZCBieSB0aGUgVW5pdGVkIFN0YXRlcyBhbmQgR2VybWFueS5bMjgyXQoKVGhlIENvbGQgV2FyIGNvbnRpbnVlcyB0byBpbmZsdWVuY2Ugd29ybGQgYWZmYWlycy4gVGhlIHBvc3QtQ29sZCBXYXIgd29ybGQgaXMgY29uc2lkZXJlZCB0byBiZSB1bmlwb2xhciwgd2l0aCB0aGUgVW5pdGVkIFN0YXRlcyB0aGUgc29sZSByZW1haW5pbmcgc3VwZXJwb3dlci5UaGUgQ29sZCBXYXIgZGVmaW5lZCB0aGUgcG9saXRpY2FsIHJvbGUgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgYWZ0ZXIgV29ybGQgV2FyIElJ4oCUYnkgMTk4OSB0aGUgVW5pdGVkIFN0YXRlcyBoYWQgbWlsaXRhcnkgYWxsaWFuY2VzIHdpdGggNTAgY291bnRyaWVzLCB3aXRoIDUyNiwwMDAgdHJvb3BzIHN0YXRpb25lZCBhYnJvYWQsWzI4Nl0gd2l0aCAzMjYsMDAwIGluIEV1cm9wZSAodHdvLXRoaXJkcyBvZiB3aGljaCBpbiB3ZXN0IEdlcm1hbnkpWzI4N10gYW5kIDEzMCwwMDAgaW4gQXNpYSAobWFpbmx5IEphcGFuIGFuZCBTb3V0aCBLb3JlYSkuWzI4Nl0gVGhlIENvbGQgV2FyIGFsc28gbWFya2VkIHRoZSB6ZW5pdGggb2YgcGVhY2V0aW1lIG1pbGl0YXJ54oCTaW5kdXN0cmlhbCBjb21wbGV4ZXMsIGVzcGVjaWFsbHkgaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIGFuZCBsYXJnZS1zY2FsZSBtaWxpdGFyeSBmdW5kaW5nIG9mIHNjaWVuY2UuWzI4OF0gVGhlc2UgY29tcGxleGVzLCB0aG91Z2ggdGhlaXIgb3JpZ2lucyBtYXkgYmUgZm91bmQgYXMgZWFybHkgYXMgdGhlIDE5dGggY2VudHVyeSwgc25vd2JhbGxlZCBjb25zaWRlcmFibHkgZHVyaW5nIHRoZSBDb2xkIFdhci5bMjg5XQoKYGBge3J9Ck5BVE8gPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkJlbGdpdW0iLCAiTmV0aGVybGFuZHMiLCAiRnJhbmNlIiwiQ2FuYWRhIiwgIlBvcnR1Z2FsIiwgIkl0YWx5IiwgIk5vcndheSIsICJEZW5tYXJrIiwgIkljZWFsbmQiLCAiVHVya2V5IiwgIkdyZWVjZSIpCm5hdG9fY2NvZGUgIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2goTkFUTywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCndhcnNhdyA8LSBjKCJSdXNzaWEiLCAiQ3plY2hvc2xvdmFraWEiLCAiUm9tYW5pYSIsICJCdWxnYXJpYSIsICJQb2xhbmQiLCAiSHVuZ2FyeSIpCndhcnNhd19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaCh3YXJzYXcsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgoKY3dfeWVhcl9zdCA9IDE5OTEKY3dfeWVhcl9lbmQgPSAxOTQ3CgpjdyA8LSBOTUMKCm5hdG9fbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIG5hdG9fY2NvZGUgKXsKICBuYXRvX25tYyA8LSByYmluZChuYXRvX25tYywgY3dbY3ckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9Cm5hdG9fbm1jICA8LSBuYXRvX25tYyBbYygyOm5yb3cobmF0b19ubWMgKSksXQpuYXRvX25tYyRzaWRlID0gIlVTIGFuZCBBbGxpZXMgIgoKd2Fyc2F3X25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB3YXJzYXdfY2NvZGUgKXsKICB3YXJzYXdfbm1jIDwtIHJiaW5kKHdhcnNhd19ubWMsIGN3W2N3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp3YXJzYXdfbm1jIDwtIHdhcnNhd19ubWNbYygyOm5yb3cod2Fyc2F3X25tYykpLF0Kd2Fyc2F3X25tYyRzaWRlID0gIlVTU1IgYW5kIEFsbGllcyIKCmN3IDwtcmJpbmQobmF0b19ubWMsd2Fyc2F3X25tYykKY3ckbWlsZXggPC0gYXMubnVtZXJpYyhjdyRtaWxleCkKY3ckbWlscGVyIDwtIGFzLm51bWVyaWMoY3ckbWlscGVyKQpjdyRwZWMgPC0gYXMubnVtZXJpYyhjdyRwZWMpCmN3JHRwb3AgPC0gYXMubnVtZXJpYyhjdyR0cG9wKQpjdyR1cG9wIDwtIGFzLm51bWVyaWMoY3ckdXBvcCkKY3ckY2luYyA8LSBhcy5udW1lcmljKGN3JGNpbmMpCmN3JHllYXIgPC0gYXMubnVtZXJpYyhjdyR5ZWFyKQpjdyRpcnN0IDwtIGFzLm51bWVyaWMoY3ckaXJzdCkKCgpjdyA8LSBjd1tjdyR5ZWFyID49IGN3X3llYXJfc3QtMTAsIF0KCmBgYAoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gY2luYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKCmBgYHtyIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xMn0KCmlyc3Q8LSAgZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWN3X3llYXJfc3QsIHhtYXg9Y3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoY3ckaXJzdCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gaXJzdCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmV4PC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyRtaWxleCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gbWlsZXgsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpwZXI8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGN3JG1pbHBlcikpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBjdywgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVjPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyRwZWMpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gY3csIGFlcyh4ID0geWVhciwgeSA9IHBlYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnVwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1jd195ZWFyX3N0LCB4bWF4PWN3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGN3JHVwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gY3csIGFlcyh4ID0geWVhciwgeSA9IHVwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp0cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49Y3dfeWVhcl9zdCwgeG1heD1jd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChjdyR0cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGN3LCBhZXMoeCA9IHllYXIsIHkgPSB0cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKZ3JpZC5hcnJhbmdlKGlyc3QsIGV4LCBwZXIsIHBlYywgdHBvcCwgdXBvcCAsIG5yb3cgPSAzKQpgYGAKCiMjS29yZWFuIFdhciAoMTk1MC0xOTUzKSAKCk9uZSBvZiB0aGUgbW9yZSBzaWduaWZpY2FudCBpbXBhY3RzIG9mIGNvbnRhaW5tZW50IHdhcyB0aGUgb3V0YnJlYWsgb2YgdGhlIEtvcmVhbiBXYXIuIEluIEp1bmUgMTk1MCwgS2ltIElsLXN1bmcncyBOb3J0aCBLb3JlYW4gUGVvcGxlJ3MgQXJteSBpbnZhZGVkIFNvdXRoIEtvcmVhLls5OV0gSm9zZXBoIFN0YWxpbiAicGxhbm5lZCwgcHJlcGFyZWQsIGFuZCBpbml0aWF0ZWQiIHRoZSBpbnZhc2lvbixbMTAwXSBjcmVhdGluZyAiZGV0YWlsZWQgW3dhcl0gcGxhbnMiIHRoYXQgd2VyZSBjb21tdW5pY2F0ZWQgdG8gdGhlIE5vcnRoIEtvcmVhbnMuVG8gU3RhbGluJ3Mgc3VycHJpc2UsWzE0XSB0aGUgVU4gU2VjdXJpdHkgQ291bmNpbCBiYWNrZWQgdGhlIGRlZmVuc2Ugb2YgU291dGggS29yZWEsIHRob3VnaCB0aGUgU292aWV0cyB3ZXJlIHRoZW4gYm95Y290dGluZyBtZWV0aW5ncyBpbiBwcm90ZXN0IHRoYXQgVGFpd2FuIGFuZCBub3QgQ29tbXVuaXN0IENoaW5hIGhlbGQgYSBwZXJtYW5lbnQgc2VhdCBvbiB0aGUgQ291bmNpbC5bMTA1XSBBIFVOIGZvcmNlIG9mIHBlcnNvbm5lbCBmcm9tIFNvdXRoIEtvcmVhLCB0aGUgVW5pdGVkIFN0YXRlcywgdGhlIFVuaXRlZCBLaW5nZG9tLCBUdXJrZXksIENhbmFkYSwgQ29sb21iaWEsIEF1c3RyYWxpYSwgRnJhbmNlLCBTb3V0aCBBZnJpY2EsIHRoZSBQaGlsaXBwaW5lcywgdGhlIE5ldGhlcmxhbmRzLCBCZWxnaXVtLCBOZXcgWmVhbGFuZCBhbmQgb3RoZXIgY291bnRyaWVzIGpvaW5lZCB0byBzdG9wIHRoZSBpbnZhc2lvbi5bMTA2XQoKCkdlbmVyYWwgRG91Z2xhcyBNYWNBcnRodXIsIFVOIENvbW1hbmQgQ2lDIChzZWF0ZWQpLCBvYnNlcnZlcyB0aGUgbmF2YWwgc2hlbGxpbmcgb2YgSW5jaGVvbiBmcm9tIHRoZSBVU1MgTXQuIE1jS2lubGV5LCBTZXB0ZW1iZXIgMTUsIDE5NTAuCkFtb25nIG90aGVyIGVmZmVjdHMsIHRoZSBLb3JlYW4gV2FyIGdhbHZhbmlzZWQgTkFUTyB0byBkZXZlbG9wIGEgbWlsaXRhcnkgc3RydWN0dXJlLlsxMDddIFB1YmxpYyBvcGluaW9uIGluIGNvdW50cmllcyBpbnZvbHZlZCwgc3VjaCBhcyBHcmVhdCBCcml0YWluLCB3YXMgZGl2aWRlZCBmb3IgYW5kIGFnYWluc3QgdGhlIHdhci4gTWFueSBmZWFyZWQgYW4gZXNjYWxhdGlvbiBpbnRvIGEgZ2VuZXJhbCB3YXIgd2l0aCBDb21tdW5pc3QgQ2hpbmEsIGFuZCBldmVuIG51Y2xlYXIgd2FyLiBUaGUgc3Ryb25nIG9wcG9zaXRpb24gdG8gdGhlIHdhciBvZnRlbiBzdHJhaW5lZCBBbmdsby1BbWVyaWNhbiByZWxhdGlvbnMuIEZvciB0aGVzZSByZWFzb25zIEJyaXRpc2ggb2ZmaWNpYWxzIHNvdWdodCBhIHNwZWVkeSBlbmQgdG8gdGhlIGNvbmZsaWN0LCBob3BpbmcgdG8gdW5pdGUgS29yZWEgdW5kZXIgVW5pdGVkIE5hdGlvbnMgYXVzcGljZXMgYW5kIHdpdGhkcmF3YWwgb2YgYWxsIGZvcmVpZ24gZm9yY2VzLlsxMDhdCgpFdmVuIHRob3VnaCB0aGUgQ2hpbmVzZSBhbmQgTm9ydGggS29yZWFucyB3ZXJlIGV4aGF1c3RlZCBieSB0aGUgd2FyIGFuZCB3ZXJlIHByZXBhcmVkIHRvIGVuZCBpdCBieSBsYXRlIDE5NTIsIFN0YWxpbiBpbnNpc3RlZCB0aGF0IHRoZXkgY29udGludWUgZmlnaHRpbmcsIGFuZCB0aGUgQXJtaXN0aWNlIHdhcyBhcHByb3ZlZCBvbmx5IGluIEp1bHkgMTk1MywgYWZ0ZXIgU3RhbGluJ3MgZGVhdGguWzMwXSBOb3J0aCBLb3JlYW4gbGVhZGVyIEtpbSBJbCBTdW5nIGNyZWF0ZWQgYSBoaWdobHkgY2VudHJhbGl6ZWQsIHRvdGFsaXRhcmlhbiBkaWN0YXRvcnNoaXAg4oCTIHdoaWNoIGNvbnRpbnVlcyB0byBkYXRlIOKAkyBhY2NvcmRpbmcgaGltc2VsZiB1bmxpbWl0ZWQgcG93ZXIgYW5kIGdlbmVyYXRpbmcgYSBmb3JtaWRhYmxlIGN1bHQgb2YgcGVyc29uYWxpdHkuWzEwOV1bMTEwXSBJbiB0aGUgU291dGgsIHRoZSBBbWVyaWNhbi1iYWNrZWQgc3Ryb25nbWFuIFN5bmdtYW4gUmhlZSByYW4gYSBzaWduaWZpY2FudGx5IGxlc3MgYnJ1dGFsIGJ1dCBkZWVwbHkgY29ycnVwdCBhbmQgYXV0aG9yaXRhcmlhbiByZWdpbWUuWzExMV0gQWZ0ZXIgUmhlZSB3YXMgb3ZlcnRocm93biBpbiAxOTYwLCBTb3V0aCBLb3JlYSBmZWxsIHdpdGhpbiBhIHllYXIgdW5kZXIgYSBwZXJpb2Qgb2YgbWlsaXRhcnkgcnVsZSB0aGF0IGxhc3RlZCB1bnRpbCB0aGUgcmUtZXN0YWJsaXNobWVudCBvZiBhIG11bHRpLXBhcnR5IHN5c3RlbSBpbiB0aGUgbGF0ZSAxOTgwcy4KCmBgYHtyfQpzayA8LSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCAiVW5pdGVkIEtpbmdkb20iLCAiU291dGggS29yZWEiKQpza19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChzaywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpuayA8LSBjKCJSdXNzaWEiLCAiTm9ydGggS29yZWEiLCAiQ2hpbmEiKQpua19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChuaywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCmt3X3llYXJfc3QgPSAxOTUwCmt3X3llYXJfZW5kID0gMTk1MwoKa3cgPC0gTk1DCgpza19ubWMgPC0gYygiIikKZm9yKGNvZGUgaW4gc2tfY2NvZGUgKXsKICBza19ubWMgPC0gcmJpbmQoc2tfbm1jLCBrd1trdyRjY29kZSA9PSBhcy5udW1lcmljKGNvZGUpLF0pCn0Kc2tfbm1jICA8LSBza19ubWMgW2MoMjpucm93KHNrX25tYyApKSxdCnNrX25tYyRzaWRlID0gIlVTIGFuZCBBbGxpZXMgIgoKbmtfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIG5rX2Njb2RlICl7CiAgbmtfbm1jIDwtIHJiaW5kKG5rX25tYywga3dba3ckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9Cm5rX25tYyA8LSBua19ubWNbYygyOm5yb3cobmtfbm1jKSksXQpua19ubWMkc2lkZSA9ICJVU1NSIGFuZCBBbGxpZXMiCgprdyA8LXJiaW5kKHNrX25tYyxua19ubWMpCgprdyRtaWxleCA8LSBhcy5udW1lcmljKGt3JG1pbGV4KQprdyRtaWxwZXIgPC0gYXMubnVtZXJpYyhrdyRtaWxwZXIpCmt3JHBlYyA8LSBhcy5udW1lcmljKGt3JHBlYykKa3ckdHBvcCA8LSBhcy5udW1lcmljKGt3JHRwb3ApCmt3JHVwb3AgPC0gYXMubnVtZXJpYyhrdyR1cG9wKQprdyRjaW5jIDwtIGFzLm51bWVyaWMoa3ckY2luYykKa3ckeWVhciA8LSBhcy5udW1lcmljKGt3JHllYXIpCmt3JGlyc3QgPC0gYXMubnVtZXJpYyhrdyRpcnN0KQoKa3cgPC0ga3dba3ckeWVhciA+PSBrd195ZWFyX3N0LTUsIF0Ka3cgPC0ga3dba3ckeWVhciA8IGt3X3llYXJfZW5kKzUsIF0KYGBgCmBgYHtyfQpnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PS40KSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IGNpbmMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpgYGAKCgpgYGB7ciBmaWcud2lkdGg9MTYsIGZpZy5oZWlnaHQ9MTJ9CgppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1rd195ZWFyX3N0LCB4bWF4PWt3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGt3JGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpleDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVyPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChrdyRtaWxwZXIpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0ga3csIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGt3LCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp1cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49a3dfeWVhcl9zdCwgeG1heD1rd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChrdyR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGt3LCBhZXMoeCA9IHllYXIsIHkgPSB1cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdHBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWt3X3llYXJfc3QsIHhtYXg9a3dfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoa3ckdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBrdywgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgojI1ZpZXRuYW0gV2FyICgxOTU1LTE5NzUpICAKCmBgYHtyfQp1cyA8LSBjKCJVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EiLCAiU291dGggS29yZWEiLCAiQ2hpbmEiLCAiTmV3IFplYWxhbmQiLCAiQXVzdHJhbGlhIikKdXNfY2NvZGUgIDwtIG1lbWJlcl9hbGxpYW5jZXMkY2NvZGVbbWF0Y2godXMsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgoKdmlldCA8LSBjKCJSdXNzaWEiLCAiTm9ydGggS29yZWEiLCAiVmlldG5hbSIsICJDdWJhIikKdmlldF9jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaCh2aWV0LCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKdndfeWVhcl9zdCA9IDE5NTUKdndfeWVhcl9lbmQgPSAxOTc1Cgp2dyA8LSBOTUMKCnVzX25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB1c19jY29kZSApewogIHVzX25tYyA8LSByYmluZCh1c19ubWMsIHZ3W3Z3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp1c19ubWMgIDwtIHVzX25tYyBbYygyOm5yb3codXNfbm1jICkpLF0KdXNfbm1jJHNpZGUgPSAiVVMgYW5kIEFsbGllcyAiCgp2aWV0X25tYyA8LSBjKCIiKQpmb3IoY29kZSBpbiB2aWV0X2Njb2RlICl7CiAgdmlldF9ubWMgPC0gcmJpbmQodmlldF9ubWMsIHZ3W3Z3JGNjb2RlID09IGFzLm51bWVyaWMoY29kZSksXSkKfQp2aWV0X25tYyA8LSB2aWV0X25tY1tjKDI6bnJvdyh2aWV0X25tYykpLF0KdmlldF9ubWMkc2lkZSA9ICJWaWV0bmFtIGFuZCBBbGxpZXMiCgp2dyA8LXJiaW5kKHVzX25tYyx2aWV0X25tYykKCnZ3JG1pbGV4IDwtIGFzLm51bWVyaWModnckbWlsZXgpCnZ3JG1pbHBlciA8LSBhcy5udW1lcmljKHZ3JG1pbHBlcikKdnckcGVjIDwtIGFzLm51bWVyaWModnckcGVjKQp2dyR0cG9wIDwtIGFzLm51bWVyaWModnckdHBvcCkKdnckdXBvcCA8LSBhcy5udW1lcmljKHZ3JHVwb3ApCnZ3JGNpbmMgPC0gYXMubnVtZXJpYyh2dyRjaW5jKQp2dyR5ZWFyIDwtIGFzLm51bWVyaWModnckeWVhcikKdnckaXJzdCA8LSBhcy5udW1lcmljKHZ3JGlyc3QpCgp2dyA8LSB2d1t2dyR5ZWFyID49IHZ3X3llYXJfc3QtNSwgXQp2dyA8LSB2d1t2dyR5ZWFyIDwgdndfeWVhcl9lbmQrNSwgXQoKYGBgCgoKYGBge3J9CmdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj12d195ZWFyX3N0LCB4bWF4PXZ3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9LjQpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB2dywgYWVzKHggPSB5ZWFyLCB5ID0gY2luYywgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmBgYAoKCgoKYGBge3IgZmlnLndpZHRoPTE2LCBmaWcuaGVpZ2h0PTEyfQppcnN0PC0gIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj12d195ZWFyX3N0LCB4bWF4PXZ3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KHZ3JGlyc3QpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpleDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckbWlsZXgpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKcGVyPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49dndfeWVhcl9zdCwgeG1heD12d195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heCh2dyRtaWxwZXIpKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gdncsIGFlcyh4ID0geWVhciwgeSA9IG1pbHBlciwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckcGVjKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IHZ3LCBhZXMoeCA9IHllYXIsIHkgPSBwZWMsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgp1cG9wPC1nZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49dndfeWVhcl9zdCwgeG1heD12d195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heCh2dyR1cG9wKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IHZ3LCBhZXMoeCA9IHllYXIsIHkgPSB1cG9wLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdHBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXZ3X3llYXJfc3QsIHhtYXg9dndfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgodnckdHBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSB2dywgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCmdyaWQuYXJyYW5nZShpcnN0LCBleCwgcGVyLCBwZWMsIHRwb3AsIHVwb3AgLCBucm93ID0gMykKYGBgCgojI1dhciBpbiBBZmdoYW5pc3RhbiAoMjAwMS0yMDEwKSAgCgoKVGhlIHdhciBpbiBBZmdoYW5pc3RhbiAob3IgdGhlIEFtZXJpY2FuIHdhciBpbiBBZmdoYW5pc3RhbikgZm9sbG93ZWQgdGhlIDIwMDEgVW5pdGVkIFN0YXRlcyBpbnZhc2lvbiBvZiBBZmdoYW5pc3Rhbi5TdXBwb3J0ZWQgaW5pdGlhbGx5IGJ5IHRoZSBVbml0ZWQgS2luZ2RvbSwgdGhlIFVTIHdhcyBsYXRlciBqb2luZWQgYnkgdGhlIHJlc3Qgb2YgTkFUTywgYmVnaW5uaW5nIGluIDIwMDMuIEl0cyBwdWJsaWMgYWltcyB3ZXJlIHRvIGRpc21hbnRsZSBhbC1RYWVkYSBhbmQgdG8gZGVueSBpdCBhIHNhZmUgYmFzZSBvZiBvcGVyYXRpb25zIGluIEFmZ2hhbmlzdGFuIGJ5IHJlbW92aW5nIHRoZSBUYWxpYmFuIGZyb20gcG93ZXIuWzMyXSBLZXkgYWxsaWVzLCBpbmNsdWRpbmcgdGhlIFVuaXRlZCBLaW5nZG9tLCBzdXBwb3J0ZWQgdGhlIFUuUy4gZnJvbSB0aGUgc3RhcnQgdG8gdGhlIGVuZCBvZiB0aGUgcGhhc2UuIFRoaXMgcGhhc2Ugb2YgdGhlIHdhciBpcyB0aGUgbG9uZ2VzdCB3YXIgaW4gVW5pdGVkIFN0YXRlcyBoaXN0b3J5LgoKClJlc3VsdDogIAoJCiogRGVzdHJ1Y3Rpb24gb2YgYWwtUWFlZGEgYW5kIFRhbGliYW4gbWlsaXRhbnQgdHJhaW5pbmcgY2FtcHMgIAoqIEZhbGwgb2YgdGhlIFRhbGliYW4gZ292ZXJubWVudCAgCiogRXN0YWJsaXNobWVudCBvZiB0aGUgSXNsYW1pYyBSZXB1YmxpYyBvZiBBZmdoYW5pc3RhbiB1bmRlciB0aGUgS2FyemFpIGFkbWluaXN0cmF0aW9uICAKKiBTdGFydCBvZiBUYWxpYmFuIGluc3VyZ2VuY3kgIAoqIERlYXRoIG9mIE9zYW1hIGJpbiBMYWRlbiAgCiogQ29tbWVuY2VtZW50IG9mIHdhcidzIDIwMTXigJNwcmVzZW50IHBoYXNlICAKIApgYGB7cn0KdXMgPC0gYygiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwgIlVuaXRlZCBLaW5nZG9tIiwgIkNhbmFkYSIsICJHZXJtYW55IiwgIkF1c3RyYWxpYSIpCnVzX2Njb2RlICA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKHVzLCBtZW1iZXJfYWxsaWFuY2VzJHN0YXRlX25hbWUpXQoKCmFmZyA8LSBjKCJBZmdoYW5pc3RhbiIpCmFmZ19jY29kZSAgPC0gbWVtYmVyX2FsbGlhbmNlcyRjY29kZVttYXRjaChhZmcsIG1lbWJlcl9hbGxpYW5jZXMkc3RhdGVfbmFtZSldCgphd195ZWFyX3N0ID0gMjAwMQphd195ZWFyX2VuZCA9IDIwMTAKCmF3IDwtIE5NQwoKdXNfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIHVzX2Njb2RlICl7CiAgdXNfbm1jIDwtIHJiaW5kKHVzX25tYywgYXdbYXckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CnVzX25tYyAgPC0gdXNfbm1jIFtjKDI6bnJvdyh1c19ubWMgKSksXQp1c19ubWMkc2lkZSA9ICJVUyBhbmQgVU4iCgphZmdfbm1jIDwtIGMoIiIpCmZvcihjb2RlIGluIGFmZ19jY29kZSApewogIGFmZ19ubWMgPC0gcmJpbmQoYWZnX25tYywgYXdbYXckY2NvZGUgPT0gYXMubnVtZXJpYyhjb2RlKSxdKQp9CmFmZ19ubWMgPC0gYWZnX25tY1tjKDI6bnJvdyhhZmdfbm1jKSksXQphZmdfbm1jJHNpZGUgPSAiQWZnaGFuaXN0YW4iCgphdyA8LXJiaW5kKHVzX25tYyxhZmdfbm1jKQoKYXckbWlsZXggPC0gYXMubnVtZXJpYyhhdyRtaWxleCkKYXckbWlscGVyIDwtIGFzLm51bWVyaWMoYXckbWlscGVyKQphdyRwZWMgPC0gYXMubnVtZXJpYyhhdyRwZWMpCmF3JHRwb3AgPC0gYXMubnVtZXJpYyhhdyR0cG9wKQphdyR1cG9wIDwtIGFzLm51bWVyaWMoYXckdXBvcCkKYXckY2luYyA8LSBhcy5udW1lcmljKGF3JGNpbmMpCmF3JHllYXIgPC0gYXMubnVtZXJpYyhhdyR5ZWFyKQphdyRpcnN0IDwtIGFzLm51bWVyaWMoYXckaXJzdCkKCmF3IDwtIGF3W2F3JHllYXIgPj0gYXdfeWVhcl9zdC0xMCwgXQoKYGBgCgpgYGB7cn0KZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD0uNCksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBjaW5jLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKYGBgCmBgYHtyIGZpZy53aWR0aD0xNiwgZmlnLmhlaWdodD0xMn0KaXJzdDwtICBnZ3Bsb3QoKSArIAogIGdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW49YXdfeWVhcl9zdCwgeG1heD1hd195ZWFyX2VuZCwgeW1pbj0wLCB5bWF4PW1heChhdyRpcnN0KSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKZXg8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JG1pbGV4KSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBtaWxleCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnBlcjwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoYXckbWlscGVyKSksYWxwaGE9MC4xLCBmaWxsID0gInNhbG1vbiIpICsKICBnZW9tX2xpbmUoZGF0YSA9IGF3LCBhZXMoeCA9IHllYXIsIHkgPSBtaWxwZXIsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpwZWM8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JHBlYykpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBhdywgYWVzKHggPSB5ZWFyLCB5ID0gcGVjLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkgKyBmYWNldF93cmFwKH5zaWRlKQoKdXBvcDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPWF3X3llYXJfc3QsIHhtYXg9YXdfeWVhcl9lbmQsIHltaW49MCwgeW1heD1tYXgoYXckdXBvcCkpLGFscGhhPTAuMSwgZmlsbCA9ICJzYWxtb24iKSArCiAgZ2VvbV9saW5lKGRhdGEgPSBhdywgYWVzKHggPSB5ZWFyLCB5ID0gdXBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpICsgZmFjZXRfd3JhcCh+c2lkZSkKCnRwb3A8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj1hd195ZWFyX3N0LCB4bWF4PWF3X3llYXJfZW5kLCB5bWluPTAsIHltYXg9bWF4KGF3JHRwb3ApKSxhbHBoYT0wLjEsIGZpbGwgPSAic2FsbW9uIikgKwogIGdlb21fbGluZShkYXRhID0gYXcsIGFlcyh4ID0geWVhciwgeSA9IHRwb3AsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSArIGZhY2V0X3dyYXAofnNpZGUpCgpncmlkLmFycmFuZ2UoaXJzdCwgZXgsIHBlciwgcGVjLCB0cG9wLCB1cG9wICwgbnJvdyA9IDMpCmBgYAoKCgpgYGB7ciBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD0zfQoKIyMgbG9va2luZyBhdCByYXRpb3MgCgpubWNfYzIgPC1ubWNfYwoKI25tY19jMiRpcnN0IDwtIG5tY19jMiRpcnN0L21heChubWNfYzIkaXJzdCkKI25tY19jMiRtaWxleCA8LSBubWNfYzIkbWlsZXgvbWF4KG5tY19jMiRtaWxleCkKI25tY19jMiRtaWxwZXIgPC0gbm1jX2MyJG1pbHBlci9tYXgobm1jX2MyJG1pbHBlcikKI25tY19jMiRwZWMgPC0gbm1jX2MyJHBlYy9tYXgobm1jX2MyJHBlYykKI25tY19jMiR0cG9wIDwtIG5tY19jMiR0cG9wL21heChubWNfYzIkdHBvcCkKI25tY19jMiR1cG9wIDwtIG5tY19jMiR1cG9wL21heChubWNfYzIkdXBvcCkKCm5tY19jMzwtIGdhdGhlcihubWNfYzIsIG1ldHJpYywgdmFsdWUsIGlyc3Q6dXBvcCkKCmdncGxvdCgpICsgCmdlb21fcmVjdChkYXRhPWQsIG1hcHBpbmc9YWVzKHhtaW4gPSB4MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGwgPSBDb25mbGljdCApLGFscGhhPTAuMjUpICsKZ2VvbV9saW5lKGRhdGEgPSBubWNfYzMsIGFlcyh4ID0geWVhciwgeSA9IHZhbHVlLCBjb2xvciA9IHN0YXRlYWJiKSwgYWxwaGEgPSAxKSArIGZhY2V0X3dyYXAofm1ldHJpYykKCmBgYAoKCgojIyBDYWxjdWxhdGUgUmF0aW9zCmBgYHtyfQoKTk1DID0gcmVhZC5jc3YocGFzdGUocGF0aCwgIk5NQy9OTUNfdjRfMC5jc3YiLCBzZXA9ICIvIikpCgpOTUMkY2luY1tOTUMkY2luYyA9PSAtOV0gPC0gMApOTUMkaXJzdFtOTUMkaXJzdCA9PSAtOV0gPC0gMApOTUMkbWlsZXhbTk1DJG1pbGV4ID09IC05XSA8LSAwCk5NQyRtaWxwZXJbTk1DJG1pbHBlcj09IC05XSA8LSAwCk5NQyRwZWNbTk1DJHBlYyA9PSAtOV0gPC0gMApOTUMkdHBvcFtOTUMkdHBvcCA9PSAtOV0gPC0gMApOTUMkdXBvcFtOTUMkdXBvcCA9PSAtOV0gPC0gMAoKCgpnZ3Bsb3QoTk1DW05NQyR5ZWFyID4gMTkwMCxdLCBhZXMoc3RhdGVhYmIsIHllYXIsIGZpbGwgPSBjaW5jKSkgKyBnZW9tX3RpbGUoKSsKICBzY2FsZV9maWxsX3ZpcmlkaXMoKSArIGdndGl0bGUoIkhlYXRtYXAgb2YgY2luYyIpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA2MCwgaGp1c3QgPSAxKSxwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMC41KSkKCgojY29tcGxldGUgY2FzZXMKY29tcGxldGUuY2FzZXMoTk1DX29yaWcpCgpgYGAKCgpgYGB7cn0KCmFsbF95ZWFyIDwtIGMoMTkwMDoyMDA3KQoKTk1DJGNpbmNbTk1DJGNpbmMgPT0gLTl8IGlzLm5hKE5NQyRjaW5jKV0gPC0gMApOTUMkaXJzdFtOTUMkaXJzdCA9PSAtOXwgaXMubmEoTk1DJGlyc3QpXSA8LSAwCk5NQyRtaWxleFtOTUMkbWlsZXggPT0gLTl8IGlzLm5hKE5NQyRtaWxleCldIDwtIDAKTk1DJG1pbHBlcltOTUMkbWlscGVyPT0gLTl8IGlzLm5hKE5NQyRtaWxwZXIpXSA8LSAwCk5NQyRwZWNbTk1DJHBlYyA9PSAtOXwgaXMubmEoTk1DJHBlYyldIDwtIDAKTk1DJHRwb3BbTk1DJHRwb3AgPT0gLTl8IGlzLm5hKE5NQyR0cG9wKV0gPC0gMApOTUMkdXBvcFtOTUMkdXBvcCA9PSAtOXwgaXMubmEoTk1DJHVwb3ApXSA8LSAwCgpOTUMkaXJzdCA8LSBhcy5udW1lcmljKE5NQyRpcnN0KQpOTUMkbWlsZXggPC0gYXMubnVtZXJpYyhOTUMkbWlsZXgpCk5NQyRtaWxwZXIgPC0gYXMubnVtZXJpYyhOTUMkbWlscGVyKQpOTUMkcGVjIDwtIGFzLm51bWVyaWMoTk1DJHBlYykKTk1DJHRwb3AgPC0gYXMubnVtZXJpYyhOTUMkdHBvcCkKTk1DJHVwb3AgPC0gYXMubnVtZXJpYyhOTUMkdXBvcCkKTk1DJGNpbmMgPC0gYXMubnVtZXJpYyhOTUMkY2luYykKTk1DJHllYXIgPC0gYXMubnVtZXJpYyhOTUMkeWVhcikKCgp5cjIwMDAgPC0gTk1DW05NQyR5ZWFyID09IDE5NzEsIF0gCmFwcGx5KHlyMjAwMCwgMiwgbWF4KQoKTk1DMiA8LSBjKCIiKQoKZm9yICh5ZWFyX3QgaW4gYWxsX3llYXIpewogIHlyIDwtIE5NQ1tOTUMkeWVhciA9PSB5ZWFyX3QsIF0gCiAgCiAgbWF4IDwtIGFwcGx5KHlyLCAyLCBtYXgpCiAgbWF4IDwtIGFzLm51bWVyaWMobWF4WzQ6OV0pCiAgCiAgZm9yIChpIGluIDQ6OSl7CiAgICB5clssaV0gPSB5clssaV0vbWF4W2ktM10KCiAgfQogIE5NQzIgPC0gcmJpbmQoTk1DMiwgeXIpCn0KCk5NQzIgPC0gTk1DMltjKDI6bnJvdyhOTUMyKSksXQoKCmBgYAoKYGBge3IgZmlnLndpZHRoPTIwLCBmaWcuaGVpZ2h0PTE1fQpkPWRhdGEuZnJhbWUoeDE9YygxOTE0LDE5MzksIDE5NDcsIDE5NTAsIDE5NTUsIDIwMDEpLCB4Mj1jKDE5MTgsIDE5NDUsIDE5OTEsIDE5NTMsIDE5NzUsIDIwMTApLCB5MT1jKDAsMCwwLDAsMCwwKSwgeTI9YyguNCwuNCwuNCwuNCwuNCwuNCksIENvbmZsaWN0PWMoIldXSSIsICJXV0lJIiwgIkNvbGQgV2FyIiwgIktvcmVhbiBXYXIiLCAiVmlldG5hbSBXYXIiLCAiQWZnaGFuaXN0YW4gV2FyIiksIHI9YygxLDIsMyw0LDUsNikpCk5NQzJfeXI8LSBOTUMyW05NQzIkeWVhciA+IDE5MDAsXQoKY291bnRyaWVzIDwtIGMoIlVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSIsICJVbml0ZWQgS2luZ2RvbSIsICJGcmFuY2UiLCAiUnVzc2lhIiwiR2VybWFueSIsICJJdGFseSIsICJKYXBhbiIsICJDaGluYSIpCmNvdW50cnlfY29kZSA8LSBtZW1iZXJfYWxsaWFuY2VzJGNjb2RlW21hdGNoKGNvdW50cmllcywgbWVtYmVyX2FsbGlhbmNlcyRzdGF0ZV9uYW1lKV0KCgpOTUMyX3lyIDwtIGZpbHRlcihOTUMyX3lyLCBOTUMyX3lyJGNjb2RlICVpbiUgY291bnRyeV9jb2RlICkKTk1DX29yaWdfeXIgPC0gZmlsdGVyKE5NQywgTk1DJGNjb2RlICVpbiUgY291bnRyeV9jb2RlICkKCk5NQzJfeXIkaXJzdCA8LSBhcy5udW1lcmljKE5NQzJfeXIkaXJzdCkKTk1DMl95ciRtaWxleCA8LSBhcy5udW1lcmljKE5NQzJfeXIkbWlsZXgpCk5NQzJfeXIkbWlscGVyIDwtIGFzLm51bWVyaWMoTk1DMl95ciRtaWxwZXIpCk5NQzJfeXIkcGVjIDwtIGFzLm51bWVyaWMoTk1DMl95ciRwZWMpCk5NQzJfeXIkdHBvcCA8LSBhcy5udW1lcmljKE5NQzJfeXIkdHBvcCkKTk1DMl95ciR1cG9wIDwtIGFzLm51bWVyaWMoTk1DMl95ciR1cG9wKQpOTUMyX3lyJGNpbmMgPC0gYXMubnVtZXJpYyhOTUMyX3lyJGNpbmMpCk5NQzJfeXIkeWVhciA8LSBhcy5udW1lcmljKE5NQzJfeXIkeWVhcikKCgoKYTwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQzJfeXIsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmEyPC0gZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DX29yaWdfeXIsIGFlcyh4ID0geWVhciwgeSA9IGlyc3QsIGNvbG9yID0gc3RhdGVhYmIsIGdyb3VwID0gc3RhdGVhYmIpKSsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikKCmI8LWdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQzJfeXIsIGFlcyh4ID0geWVhciwgeSA9IG1pbGV4LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpiMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKYzwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DMl95ciwgYWVzKHggPSB5ZWFyLCB5ID0gbWlscGVyLCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpjMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgpkMjwtIGdncGxvdCgpICsgCiAgZ2VvbV9yZWN0KGRhdGE9ZCwgbWFwcGluZz1hZXMoeG1pbj14MSwgeG1heD14MiwgeW1pbj0wLCB5bWF4PTEsIGZpbGw9Q29uZmxpY3QpLGFscGhhPTAuMTUpICsKICBnZW9tX2xpbmUoZGF0YSA9IE5NQ19vcmlnX3lyLCBhZXMoeCA9IHllYXIsIHkgPSBpcnN0LCBjb2xvciA9IHN0YXRlYWJiLCBncm91cCA9IHN0YXRlYWJiKSkrIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpCgoKZDwtZ2dwbG90KCkgKyAKICBnZW9tX3JlY3QoZGF0YT1kLCBtYXBwaW5nPWFlcyh4bWluPXgxLCB4bWF4PXgyLCB5bWluPTAsIHltYXg9MSwgZmlsbD1Db25mbGljdCksYWxwaGE9MC4xNSkgKwogIGdlb21fbGluZShkYXRhID0gTk1DMl95ciwgYWVzKHggPSB5ZWFyLCB5ID0gdHBvcCwgY29sb3IgPSBzdGF0ZWFiYiwgZ3JvdXAgPSBzdGF0ZWFiYikpKyB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKQoKCgoKZ3JpZC5hcnJhbmdlKGEsYTIsIGIsIGIyLCBjLCBjMiwgZCAsbnJvdyA9IDQgKQoKCmBgYAoK